package com.ruoyi.flow.common.tools.fastdfs;

import java.io.File;
import java.io.InputStream;

import org.csource.common.NameValuePair;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * FastDFS工具类，用于向FastDFS中上传文件、下载文件到服务器临时目录、删除文件。
 * 
 * @author wtian
 * 
 */
public class FdfsOperator {
    public static final InnerFastDFSApi FAST_DFS_UTILS = new InnerFastDFSApi();
    private static final Logger LOGGER = LoggerFactory.getLogger(FdfsOperator.class);
    public FdfsOperator() {

    }

    /**
     * 将文件上传到FastDFS服务器
     * 
     * @param file
     *            {@link File}
     * @return 上传成功后的远程文件信息，包括<i>远程组名</i>和<i>远程文件名</i>。通过这两个信息可以对远程文件进行下载、删除等操作。
     * @see RemoteFileInfo
     */
    public RemoteFileInfo upload(File file) {
        InnerFastDFSApi.FdfsFileInfo fdfsFileInfo = FAST_DFS_UTILS.upload(file);
        RemoteFileInfo fileInfo = new RemoteFileInfo(fdfsFileInfo.getGroupName(), fdfsFileInfo.getRemoteFileName());
        return fileInfo;
    }

    /**
     * 获取FastDFS服务器上的文件的HTTP地址，可以通过该地址直接下载文件。
     * 
     * @param fileInfo
     *            {@link RemoteFileInfo}
     * @return http格式url
     */
    public String getFileUrl(RemoteFileInfo fileInfo) {
        return FAST_DFS_UTILS.getFileUrl(fileInfo);
    }

    /**
     * 从FastDFS服务器上下载文件到本地tomcat服务器
     * 
     * @param fileInfo
     *            {@link RemoteFileInfo}
     * @param destPath
     *            本地文件路径。如果不存在会默认使用java临时目录
     * @param destFileName
     *            本地文件名。如果为空，则上传时的文件名作为目标文件名
     * @return 下载后的{@link File}对象
     */
    public File download(RemoteFileInfo fileInfo, String destPath, String destFileName) {
        return FAST_DFS_UTILS.download(fileInfo,destPath,destFileName);
    }

    /**
     * 删除FastDFS服务器上的文件
     * 
     * @param fileInfo
     *            {@link RemoteFileInfo}
     */
    public void delete(RemoteFileInfo fileInfo) {
        FAST_DFS_UTILS.delete(fileInfo);
    }


    /**
     * 上传文件返回的文件基本信息，包含远程文件的文件名以及远程文件的组名
     *
     * @author wtian
     *
     */
    public class RemoteFileInfo extends InnerFastDFSApi.FdfsFileInfo {

        public RemoteFileInfo(String groupName, String remoteFileName) {
            super(groupName,remoteFileName);
        }
    }

    /**
     * 将流上传到FastDFS，返回URL
     * @param in
     * @param metas
     * @param suffix
     * @return
     */
    public String upload(InputStream in,NameValuePair[] metas,String suffix) {
        return FAST_DFS_UTILS.upload(in, metas, suffix);
    }
    

    public static void main(String[] args) {
        final File file = new File("c:/123.txt");
        //测试多个实例化FdfsUtils对同一个线程池的操作
        for(int i = 0;i<10;i++){
            FdfsOperator fdfsUtils = new FdfsOperator();
            RemoteFileInfo remoteFileInfo = fdfsUtils.upload(file);
            LOGGER.debug(fdfsUtils.getFileUrl(remoteFileInfo));
        }

        //测试多个线程的操作
        for(int i = 0;i<10;i++){
            Thread thread = new Thread(new Runnable() {
                @Override
                public void run() {
                    FdfsOperator fdfsUtils = new FdfsOperator();
                    RemoteFileInfo remoteFileInfo = fdfsUtils.upload(file);
                    LOGGER.debug(fdfsUtils.getFileUrl(remoteFileInfo));
                }
            });
            thread.start();
        }
               
    }
}
